package com.free.ext.shiro.filter;

import com.free.ext.shiro.token.CapatchaUserPwdToken;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
import org.apache.shiro.web.util.WebUtils;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * <p>
 * 功能概述:
 * </p>
 * <p>
 * 功能详述:
 * </p>
 */
public class CaptchaFormAuthenticationFilter extends FormAuthenticationFilter {
    /*========================================================================*
     *                         Public Fields (公共属性)
     *========================================================================*/

    /*========================================================================*
     *                         Private Fields (私有属性)
     *========================================================================*/
    private static final String DEFAULT_CAPTCHA_PARAM = "captcha";

    private String captchaParam = DEFAULT_CAPTCHA_PARAM;

    /*========================================================================*
     *                         Construct Methods (构造方法)
     *========================================================================*/

    /*========================================================================*
     *                         Public Methods (公有方法)
     *========================================================================*/

    /**
     * 取得客户端图像验证码的项目名
     * @return
     */
    public String getCaptchaParam()
    {
        return captchaParam;
    }

    /**
     * 设置客户端图像验证码的项目名
     * @param captchaParam
     */
    public void setCaptchaParam(String captchaParam)
    {
        this.captchaParam = captchaParam;
    }

    /**
     * 根据客户端输入情报生成 shiro 认证用的 token
     */
    @Override
    protected AuthenticationToken createToken(ServletRequest request, ServletResponse response)
    {
        // 将画面上用户输入的认证信息做成 token（实际认证的检查在自定义的 realms 类里面完成）
        String username = getUsername(request);
        String password = getPassword(request);
        String captcha = getCaptcha(request);
        boolean rememberMe = isRememberMe(request);
        String host = getHost(request);
        return new CapatchaUserPwdToken(captcha, username, password, host, rememberMe);
    }

    // 取得客户端图像验证码的值
    protected String getCaptcha(ServletRequest request)
    {
        return WebUtils.getCleanParam(request, getCaptchaParam());
    }
    /*========================================================================*
     *                         Private Methods (私有方法)
     *========================================================================*/
}
